Repository navigation
fix(compliance): set aside unadvertised request signing in Strict Spec - #8952
Merged
bokelley merged 1 commit intoNov 13, 2026
Merged
Conversation
grading - treat signed_requests as not applicable when the runner set it aside only because the agent does not advertise request_signing.supported - keep runner limitations, test-kit gaps and failures incomplete - list incomplete bundle ids in the Strict Spec evidence docs - add the signed_requests row to how grading works
Preview approval requiredThis pull request comes from a fork, so Mintlify won't build a preview until someone with write access approves commit |
Contributor
There was a problem hiding this comment.
Ladon verdict: Approve
Approve — clean server-only Strict Spec change.
No Critical/High/Medium findings reported. Verified the key non-escalation conditions:
static/schemas/source/**untouched — no schema↔docs coherence concern; OpenAPI regenerated to match the Zod registry and the docs row is coherent with the schema description.- Changeset correctly omitted (server logic + non-normative docs; scope check passes).
- Not a breaking-class protocol change —
signed_requestsis set aside when an agent doesn't advertiserequest_signing.supported: true, and a newincomplete_bundle_idsevidence field is additive server-side behavior; the hard breaking-class gate does not apply. gated_paths: false, so row 2 does not fire despitereview_decision: REVIEW_REQUIRED.high_risk: false, no author team gate.
The requestSigningNotAdvertised path is fail-closed on every guard and onlyUnmetSignerRow acts as a real suspender so a malformed capability shape can't wrongly pass. New test coverage (verification-profile-request-signing.test.ts, +391 net) exercises the throwing Proxy client and the fail-closed guard matrix. Rows 1–8 do not match; falls through to row 9.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refs #8534
No Strict Spec verdict changes today.
webhook-emission,webhook-receiver-envelopeandidempotency(hosted runner and test-kit gaps) keep every hosted agentpartial. 3.1 media-buy sellers also keep their declined-capability bundles until the SDK change below ships. This PR removes one universal blocker for every agent that does not sign requests, and makes the saved run list the bundles that block Strict.Problem
Strict Spec (
strict-complete-bundlesinserver/src/services/verification-profile-assessment.ts) counts every relevantpartialoruntestedbundle as incomplete. #8534 lists 19 such bundles for a media-buy 3.1 seller whose executed checks all pass. Most of them are now covered elsewhere:storyboards_missing_tools)error-compliance-signalsandschema-validation-signalsonly, #8601 also adds rootsupported_protocolsgates in source (future releases), which adcp-client#3520 (in the pinned@adcp/sdk17.0.0-beta.21) evaluates before missing tools. The four pagination storyboards are covered by #8824 onlywholesale-feed-*and the 31 "never selected"media-buyscenariosmedia-buybundle has exactly 31), and the runner sets these aside ascapability_unsupported. adcp-client#2960 grades thatnot_applicableonly from AdCP 3.2 (CAPABILITY_ROLLUP_MIN_ADCP_VERSION, unchanged on adcp-client main 10f6fcd51 and in 17.0.0-beta.22 and beta.23). Fixing 3.1.24+ belongs in the SDK; see Follow-upssigned-requestswebhook-emission,webhook-receiver-envelope,idempotencysigned_requests"runs for any agent advertisingrequest_signing.supported: true". For other agents, "absence of advertisement is not a failure" (signed-requests.yaml, every release since 3.0.1). The runner reports this asrequirement_unmet:request_signer(skip_reason: not_applicable,requirement: request_signer). The SDK grades itpartialon every release, so every agent that does not sign requests has an incomplete universal bundle.Changes
server/src/services/verification-profile-request-signing.ts(new)requestSigningNotAdvertised(result)is true only when all of these hold; the assessment then setssigned_requestsaside:request_signing.supported: true;storyboards_missing_tools;storyboard-assertion-failedobservation names it;Any other unmet requirement, test-kit gap or fixture gap stays a coverage gap (
runner-output-contract.yaml>skip_result).server/src/services/verification-profile-assessment.tspartialonly by fix(compliance): stop Strict counting undeclared universal surfaces as incomplete (#8527) #8824's undeclared surfaces or by this rule is reported innot_applicable_universal_bundle_ids.incomplete_bundle_ids(kind:id). Only a count was stored before, so the saved run did not say which bundles block Strict.server/src/services/verification-profile-tool-obligations.tsExports
record()for reuse.server/src/schemas/registry.ts,static/openapi/registry.yamlDocument
incomplete_bundle_idsand the widenednot_applicable_universal_bundle_ids. The OpenAPI file is regenerated.docs/building/verification/how-grading-works.mdxAdds one "Pass vs partial coverage" row for
signed_requests, noting that other unmet runner requirements still count as incomplete. The next row now excepts both thecontrollerandrequest_signerrows.Tests
server/tests/unit/verification-profile-request-signing.test.tsmodels the #8534 agent: media-buy,sales-non-guaranteed,supported_protocols: ["media_buy"], no wholesale feed, request signing, audience targeting or reach metrics. Gate rows come from the SDK's ownrunStoryboard(with a client that fails if called) and its track projection. Bundle statuses come frombuildComplianceBundleResultson the real 3.1.29 and 3.2.10 catalogs.signed-requestsand fix(compliance): stop Strict counting undeclared universal surfaces as incomplete (#8527) #8824's six bundles are set aside.incomplete_bundle_idslists the fivewholesale-feed-*bundles,webhook-emission,webhook-receiver-envelope,idempotencyandprotocol:media-buy.signed-requests.link-compliance-symbols --checkand the changeset scope check pass. Committed withHUSKY=0; CI is authoritative for the full suite.Changeset
None: server and non-normative docs only. The protocol-scope check passes.
Out of scope / follow-ups
wholesale-feed-*and protocol bundles with declined scenarios incomplete. The test asserts the current SDK verdicts on purpose, so the SDK bump trips it.requires_capability: {path: request_signing.supported, equals: true}insigned-requests.yaml. The fix(registry): pick JWKS per-token from iss claim, not WORKOS_CLIENT_ID #2960 rollup then neutralizes it from the next release, so SDK and hosted agree there. Released 3.1/3.2 bundles still need this server rule.webhook_emission,webhook_receiver_envelopeand the idempotency rate-limit phase need a webhook receiver, a replay receiver and the rate-limit test kit. A maintainer could also decide thatwebhook_receiver_envelope("not for seller endpoint grading") does not apply to seller roles. Until then no hosted agent reaches Strict.verification-profile-shadow.ts) is not aligned, as in fix(compliance): stop Strict counting undeclared universal surfaces as incomplete (#8527) #8824. Dashboard wording is Strict Spec card shows a hypothetical now+48h grace deadline as if it were running #8535. Hosted compliance grader fails controller-seeded storyboards for sellers without comply_test_controller (regression since SDK 17) #8576 is separate.🤖 Generated with Claude Code